# -*- coding: utf-8 -*-

# Create your views here.
from estadisticas.models import Cumplimiento, NoConformidades, Produccion
from pedidos.models import Pedido, DetallePedido
from control.models import Control, DetalleControl, Evaluacion
import datetime
from dateutil.relativedelta import relativedelta
from django.views.generic.list_detail import object_list, object_detail
from django.template.context import RequestContext
from django.shortcuts import render_to_response
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect, HttpResponse
from django.db.models import Q
from estadisticas.forms import PlanchuelasForm,CanoCuadradoForm,CanoCircularForm,VarillaForm,TuercaForm,BulonForm

def listar(request,ot,o,page):

    date = datetime.date.today()
    date = date + relativedelta(months = +1)
    month = date.month
    year = date.year
    start = datetime.date(year,month,1)
    
    start = start + relativedelta(months = -7)
    d = start.month

    while d != month:
        
        end = start + relativedelta(months = +1)
#        if not a:
        cum = Pedido.objects.filter(plazo__gte = start,plazo__lt = end)
#            total = cum.count()
        caliente = Pedido.objects.none()
        frio = Pedido.objects.none()
        if cum:
            for c in cum:
                if c.proceso == 'C' and c not in caliente:
                    caliente = caliente | cum.filter(id=c.id)
                elif c.proceso == 'F' and c not in frio:
                    frio = frio | cum.filter(id=c.id)
        
        tfrio = frio.count()
        tcaliente = caliente.count()
        
        if tfrio != 0:
#        if tfrio:
            frio = frio.filter(Q(finalizado='M')|
                               Q(finalizado='I')|
                               Q(finalizado='G')|
                               Q(finalizado='D'))
            inc = frio.count()
            c = tfrio - inc
            fin = end + relativedelta(days = -1)
            a = Cumplimiento.objects.filter(proceso='F',inicio=start)
            if not a:
                new_cum = Cumplimiento(proceso='F',inicio=start,fin=fin,cumplidos=c,nocumplidos=inc,total=tfrio,incumplimiento=inc*100/tfrio,cumplimiento=c*100/tfrio)
                new_cum.save()
            else:
                a = Cumplimiento.objects.get(proceso='F',inicio=start)
                a.cumplidos = c
                a.nocumplidos = inc
                a.total = tfrio
                a.incumplimiento = inc*100/tfrio
                a.cumplimiento = c*100/tfrio
                a.save()
        
        if tcaliente != 0:
            caliente = caliente.filter(Q(finalizado='M')|
                                       Q(finalizado='I')|
                                       Q(finalizado='G')|
                                       Q(finalizado='D'))
            inc = caliente.count()
            c = tcaliente - inc
            fin = end + relativedelta(days = -1)
            a = Cumplimiento.objects.filter(proceso='C',inicio=start)
            if not a:
                new_cum = Cumplimiento(proceso='C',inicio=start,fin=fin,cumplidos=c,nocumplidos=inc,total=tcaliente,incumplimiento=inc*100/tcaliente,cumplimiento=c*100/tcaliente)
                new_cum.save()
            else:
                a = Cumplimiento.objects.get(proceso='C',inicio=start)
                a.cumplidos = c
                a.nocumplidos = inc
                a.total = tcaliente
                a.incumplimiento = inc*100/tcaliente
                a.cumplimiento = c*100/tcaliente
                a.save()
            
        start = end
        d = start.month
    
    request.breadcrumbs([('Cumplimientos e Incumplimientos',request.path)])
    
    if ot=='asc':
        if int(o) == 1:
            orden = "-inicio"
        else:
            orden = "-inicio"
    elif ot=='desc':
        if int(o) == 1:
            orden = "inicio"
        else:
            orden = "inicio"
    else:
        orden = "-inicio"
    return object_list(request,
                       queryset = Cumplimiento.objects.order_by(orden),
                       allow_empty = True,
                       template_name = 'estadisticas/listarCumplimientos.html',
                       extra_context = {'ot':ot,'o':o,'page':page},
                       paginate_by = 20,
                       page = page,
                       )

def listarNoConformidades(request,ot,o,page):

    date = datetime.date.today()
    date = date + relativedelta(months = +1)
    month = date.month
    year = date.year
    start = datetime.date(year,month,1)
    
    start = start + relativedelta(months = -7)
    d = start.month

    while d != month:
        
        end = start + relativedelta(months = +1)
#        if not a:
        cum = Evaluacion.objects.filter(fecha__gte = start,fecha__lt = end)
#            total = cum.count()
        caliente = Pedido.objects.none()
        frio = Pedido.objects.none()
        if cum:
            for c in cum:
                if c.detalle.proceso == 'C' and c not in caliente:
                    caliente = caliente | cum.filter(id=c.id)
                elif c.detalle.proceso == 'F' and c not in frio:
                    frio = frio | cum.filter(id=c.id)
        
        tfrio = frio.count()
        tcaliente = caliente.count()
        
        if tfrio != 0:
            tot = frio.count()
            proc = frio.filter(clase='P').count()
            limp = frio.filter(clase='L').count()
            mat = frio.filter(clase='M').count()
            fin = end + relativedelta(days = -1)
            a = NoConformidades.objects.filter(proceso='F',inicio=start)
            if not a:
                new_cum = NoConformidades(proceso='F',inicio=start,fin=fin,total=tot,proc=proc,limp=limp,mat=mat)
                new_cum.save()
            else:
                a = NoConformidades.objects.get(proceso='F',inicio=start)
                a.total = tot
                a.proc = proc
                a.limp = limp
                a.mat = mat
                a.save()
        
        if tcaliente != 0:
            tot = caliente.count()
            proc = caliente.filter(clase='P').count()
            limp = caliente.filter(clase='L').count()
            mat = caliente.filter(clase='M').count()
            fin = end + relativedelta(days = -1)
            a = NoConformidades.objects.filter(proceso='C',inicio=start)
            if not a:
                new_cum = NoConformidades(proceso='C',inicio=start,fin=fin,total=tot,proc=proc,limp=limp,mat=mat)
                new_cum.save()
            else:
                a = NoConformidades.objects.get(proceso='C',inicio=start)
                a.total = tot
                a.proc = proc
                a.limp = limp
                a.mat = mat
                a.save()
            
        start = end
        d = start.month
    
    request.breadcrumbs([('No Conformidades',request.path)])
    
    if ot=='asc':
        if int(o) == 1:
            orden = "-inicio"
        else:
            orden = "-inicio"
    elif ot=='desc':
        if int(o) == 1:
            orden = "inicio"
        else:
            orden = "inicio"
    else:
        orden = "-inicio"
    return object_list(request,
                       queryset = NoConformidades.objects.order_by(orden),
                       allow_empty = True,
                       template_name = 'estadisticas/listarNoConformidades.html',
                       extra_context = {'ot':ot,'o':o,'page':page},
                       paginate_by = 20,
                       page = page,
                       )

def menu(request):
    request.breadcrumbs([('Calculadora',request.path)])
    return render_to_response('calculadora/menu.html',context_instance = RequestContext(request))


def planchuela(request):
    
    request.breadcrumbs([('Calculadora',reverse(menu,args=[])),('Planchuela',request.path)])
    
    pieza = 'Planchuela'
    if request.method == "POST":
        pform = PlanchuelasForm(request.POST)
        if pform.is_valid():
            cleaned_data = super(PlanchuelasForm, pform).clean()
            l = cleaned_data.get('largo')
            a = cleaned_data.get('ancho')
            e = cleaned_data.get('espesor')
            
            area = ((l+a)*e*2) + (l*a*2)
            
            return render_to_response('calculadora/area.html', {'area': area,'largo': l,'ancho':a,'espesor':e,'pieza':pieza}, context_instance=RequestContext(request))
            
    else:
        pform = PlanchuelasForm()   
        
    return render_to_response('calculadora/calculadora.html', {'form': pform,'pieza':pieza}, context_instance=RequestContext(request))


def canoCuadrado(request):
    
    request.breadcrumbs([('Calculadora',reverse(menu,args=[])),('Caño Cuadrado',request.path)])
    
    pieza = 'Caño Cuadrado'
    if request.method == "POST":
        pform = CanoCuadradoForm(request.POST)
        if pform.is_valid():
            cleaned_data = super(CanoCuadradoForm, pform).clean()
            l = cleaned_data.get('largo')
            a = cleaned_data.get('ancho')
            b = cleaned_data.get('ancho2')
            e = cleaned_data.get('espesor')
            
            area = (l*a*2) + (l*b*2) + ((a+b)*e*4)
            
            return render_to_response('calculadora/area.html', {'area': area,'largo': l,'ancho':a,'ancho2':b,'espesor':e,'pieza':pieza}, context_instance=RequestContext(request))
            
    else:
        pform = CanoCuadradoForm()   
        
    return render_to_response('calculadora/calculadora.html', {'form': pform,'pieza':pieza}, context_instance=RequestContext(request))


def canoCircular(request):
    
    request.breadcrumbs([('Calculadora',reverse(menu,args=[])),('Caño Circular',request.path)])
    
    pieza = 'Caño Circular'
    if request.method == "POST":
        pform = CanoCircularForm(request.POST)
        if pform.is_valid():
            cleaned_data = super(CanoCircularForm, pform).clean()
            l = cleaned_data.get('largo')
            d = cleaned_data.get('diametro')
            e = cleaned_data.get('espesor')
            
            area = (d*e*3.14*2) + (d*l*3.14)
            
            return render_to_response('calculadora/area.html', {'area': area,'largo': l,'diametro':d,'espesor':e,'pieza':pieza}, context_instance=RequestContext(request))
            
    else:
        pform = CanoCircularForm()   
        
    return render_to_response('calculadora/calculadora.html', {'form': pform,'pieza':pieza}, context_instance=RequestContext(request))


def varilla(request):
    
    request.breadcrumbs([('Calculadora',reverse(menu,args=[])),('Varilla',request.path)])
    
    pieza = 'Varilla'
    if request.method == "POST":
        pform = VarillaForm(request.POST)
        if pform.is_valid():
            cleaned_data = super(VarillaForm, pform).clean()
            l = cleaned_data.get('largo')
            l2 = cleaned_data.get('largo2')
            d = cleaned_data.get('diametro')
            
            area = (d*l*3.14) + (d*d*3.14/2) + (3.14*d*l2*2)
            
            return render_to_response('calculadora/area.html', {'area': area,'largo': l,'diametro':d,'pieza':pieza}, context_instance=RequestContext(request))
            
    else:
        pform = VarillaForm()   
        
    return render_to_response('calculadora/calculadora.html', {'form': pform,'pieza':pieza}, context_instance=RequestContext(request))

def tuerca(request):
    
    request.breadcrumbs([('Calculadora',reverse(menu,args=[])),('Tuerca',request.path)])
    
    pieza = 'Tuerca'
    if request.method == "POST":
        pform = TuercaForm(request.POST)
        if pform.is_valid():
            cleaned_data = super(TuercaForm, pform).clean()
            l = cleaned_data.get('largo')
            a = cleaned_data.get('ancho')
            de = cleaned_data.get('diametroE')
            di = cleaned_data.get('diametroI')
            
            area = (a*l*6) + (3.14*((de*de)-(di*di))/2) + (3.14*di*a*2)
            
            return render_to_response('calculadora/area.html', {'area': area,'largo': l,'ancho': a,'diametroE':de,'diametroI':di,'pieza':pieza}, context_instance=RequestContext(request))
            
    else:
        pform = TuercaForm()   
        
    return render_to_response('calculadora/calculadora.html', {'form': pform,'pieza':pieza}, context_instance=RequestContext(request))

def bulon(request):
    
    request.breadcrumbs([('Calculadora',reverse(menu,args=[])),('Bulón',request.path)])
    
    pieza = 'Bulón'
    if request.method == "POST":
        pform = BulonForm(request.POST)
        if pform.is_valid():
            cleaned_data = super(BulonForm, pform).clean()
            l = cleaned_data.get('largo')
            a = cleaned_data.get('ancho')
            de = cleaned_data.get('diametroE')
            di = cleaned_data.get('diametroI')
            l2 = cleaned_data.get('largo2')
            l3 = cleaned_data.get('largo3')
            
            
            area = (3.14*de*de/2) + (a*l*6) + 3.14*de*l3 + 3.14*di*l2*2
            
            return render_to_response('calculadora/area.html', {'area': area,'largo': l,'ancho': a,'diametroE':de,'diametroI':di,'largo2': l2,'largo3': l3,'pieza':pieza}, context_instance=RequestContext(request))
            
    else:
        pform = BulonForm()   
        
    return render_to_response('calculadora/calculadora.html', {'form': pform,'pieza':pieza}, context_instance=RequestContext(request))

def arandela(request):
    
    request.breadcrumbs([('Calculadora',reverse(menu,args=[])),('Arandela',request.path)])
    
    pieza = 'Arandela'
    if request.method == "POST":
        pform = ArandelaForm(request.POST)
        if pform.is_valid():
            cleaned_data = super(ArandelaForm, pform).clean()
            de = cleaned_data.get('diametroE')
            di = cleaned_data.get('diametroI')
            e = cleaned_data.get('espesor')
            
            area = (de*e*3.14) + (di*e*3.14) + ((de*de)-(di*di))*3.14/2
            
            return render_to_response('calculadora/area.html', {'area': area,'diametroE': de,'diametroI':di,'espesor':e,'pieza':pieza}, context_instance=RequestContext(request))
            
    else:
        pform = ArandelaForm()   
        
    return render_to_response('calculadora/calculadora.html', {'form': pform,'pieza':pieza}, context_instance=RequestContext(request))

def listarPedidos(request,ot,o,page,month,year,proc):
    
    request.breadcrumbs([('Calculadora',reverse(menu,args=[])),('Pedidos',request.path)])
    inicio = datetime.date(int(year),int(month),1)
    fin = inicio + relativedelta(months = +1)
    if ot=='asc':
        if int(o) == 1:
            orden = "-ot"
        elif int(o) == 2:
            orden = "-cliente"
        elif int(o) == 3:
            orden = "-fecha"
        elif int(o) == 4:
            orden = "-plazo"
        else:
            orden = "-ot"
    elif ot=='desc':
        if int(o) == 1:
            orden = "ot"
        elif int(o) == 2:
            orden = "cliente"
        elif int(o) == 3:
            orden = "fecha"
        elif int(o) == 4:
            orden = "plazo"
        else:
            orden = "ot"
    else:
        orden = "-ot"
    pedidos = Pedido.objects.filter(Q(finalizado='M')|
                            Q(finalizado='G')|
                            Q(finalizado='I')|
                            Q(finalizado='D'))
    pedidos = pedidos.filter(plazo__gte=inicio.isoformat(),plazo__lt=fin.isoformat()).order_by(orden)
    ped = Pedido.objects.none()
    for c in pedidos:
        det = DetallePedido.objects.filter(pedido=c)
        for d in det:
            if proc == 'C' and d.proceso == 'C' and c not in ped:
                ped = ped | pedidos.filter(id=c.id)
            elif proc == 'F' and d.proceso == 'F' and c not in ped:
                ped = ped | pedidos.filter(id=c.id)
    return object_list(request,
                       queryset = ped,
                       allow_empty = True,
                       template_name = 'estadisticas/listarPedidos.html',
                       extra_context = {'ot':ot,'o':o,'page':page,'month':month,'year':year,'proc':proc},
                       paginate_by = 20,
                       page = page,
                       )
    
def listarProduccion(request,ot,o,page,p):

    date = datetime.date.today()
    date = date + relativedelta(months = +1)
    month = date.month
    year = date.year
    start = datetime.date(year,month,1)
    
    start = start + relativedelta(months = -7)
    d = start.month

    while d != month:
        
        end = start + relativedelta(months = +1)
#        if not a:
        controles = Control.objects.filter(fecha__gte = start,fecha__lt = end,pedido__proceso = p)
#            total = cum.count()
        if controles:
            internos = controles.filter(nombre__icontains='wal')
            
        fin = end + relativedelta(days = -1)
        
        kgrt = 0
        kgpt = 0
        unt = 0
        for con in controles:
            kgrt = kgrt + con.kgreal
            kgpt = kgpt + con.kgproc
            unt = unt + con.unidades
            
        a = Produccion.objects.filter(tipo='T',proceso=p,inicio=start)
        if not a:
            new_prod = Produccion(tipo='T',proceso=p,inicio=start,fin=fin,unidades=unt,kgreal=kgrt,kgproc=kgpt)
            new_prod.save()
        else:
            a = Produccion.objects.get(tipo='T',proceso=p,inicio=start)
            a.unidades = unt
            a.kgreal = kgrt
            a.kgproc = kgpt
            a.save()
            
        kgri = 0
        kgpi = 0
        uni = 0
        for con in internos:
            kgri = kgri + con.kgreal
            kgpi = kgpi + con.kgproc
            uni = uni + con.unidades
            
        a = Produccion.objects.filter(tipo='I',proceso=p,inicio=start)
        if not a:
            new_prod = Produccion(tipo='I',proceso=p,inicio=start,fin=fin,unidades=uni,kgreal=kgri,kgproc=kgpi)
            new_prod.save()
        else:
            a = Produccion.objects.get(tipo='I',proceso=p,inicio=start)
            a.unidades = uni
            a.kgreal = kgri
            a.kgproc = kgpi
            a.save()
        
        kgre = kgrt - kgri
        kgpe = kgpt - kgpi
        une = unt - uni
        
        a = Produccion.objects.filter(tipo='E',proceso=p,inicio=start)
        if not a:
            new_prod = Produccion(tipo='E',proceso=p,inicio=start,fin=fin,unidades=une,kgreal=kgre,kgproc=kgpe)
            new_prod.save()
        else:
            a = Produccion.objects.get(tipo='E',proceso=p,inicio=start)
            a.unidades = une
            a.kgreal = kgre
            a.kgproc = kgpe
            a.save()
        
        start = end
        d = start.month
    
    request.breadcrumbs([('Cumplimientos e Incumplimientos',request.path)])
    
    if ot=='asc':
        if int(o) == 1:
            orden = "-inicio"
        else:
            orden = "-inicio"
    elif ot=='desc':
        if int(o) == 1:
            orden = "inicio"
        else:
            orden = "inicio"
    else:
        orden = "-inicio"
    return object_list(request,
                       queryset = Produccion.objects.filter(proceso=p).order_by(orden),
                       allow_empty = True,
                       template_name = 'estadisticas/listarProduccion.html',
                       extra_context = {'ot':ot,'o':o,'page':page, 'p':p},
                       paginate_by = 20,
                       page = page,
                       )